package com.knowledge.plus.抽象类与接口;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

/**
 * 抽象类是一种特殊的类，它不能被实例化，只能被继承。
 * 抽象类具有类的所有特性，包括成员变量、成员方法、构造方法等，但是其中的某些方法是抽象的，需要在具体的子类中实现。
 *
 * @author TPF
 * @since 2023/12/5
 */
@Data
abstract class Animal {

    String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void makeSound();

    public void printAnimalName() {
        System.out.println("名字: " + name);
    }

}

/**
 * 抽象类可以提供一些通用的方法实现和字段，而子类可以继承和扩展这些方法和字段。
 */
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
class Dog extends Animal {

    private String watch;

    public Dog(String watch, String name) {
        super(name);
        this.watch = watch;
    }

    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }

    public void printDogName() {
        System.out.println("名字: " + name);
    }

}